// 用户相关接口
const { Router } = require('express');
const { check, checkStudentGet } = require('../utils/valitate');
const { createUpload, parseFilePath } = require('../utils/file');
const query = require('../utils/query')
const fs = require('fs/promises');


const router = Router();

// 生成文件处理中间件, 存储文件到public/upload/course
const upload = createUpload('public/upload/course');

// 使用一个该路由独享的中间件,来进行权限的校验
router.use(checkStudentGet);


router.route('/')
    .post(  // 添加课程
        upload.single('img'),   // 存储img字段对应的文件
        check([], ['name']),    // 校验body中的name参数
        async (req, res) => {   // 添加课程
            try {
                // 先判断封面是否存在,
                if (!req.file) {
                    return res.send({
                        code: 0,
                        msg: '请上传封面'
                    });
                }
                // 执行sql
                await query(
                    "INSERT INTO course (img,name) values (?,?)",
                    [req.file.path, req.body.name]
                );
                // 只要上面的插入操作promise成功, 就可以响应创建成功了
                res.send({
                    code: 1,
                    msg: '创建成功'
                });
            } catch (error) {
                console.log(error);
                res.send({
                    code: 0,
                    msg: '创建失败'
                });
            }
        }
    )
    .get(   // 获取课程
        check(['pageSize', 'pageIndex']),
        async (req, res) => {
            try {
                const { pageSize, pageIndex } = req.query;
                // 学生只能看到上架的课程
                // 管理员可以看到所有的课程
                // 1 根据用户信息判断用户身份
                console.log(req.userInfoLaoGuo.type);   // 0为学生,1为管理员
                // 2 根据身份生成sql
                const sql = `SELECT SQL_CALC_FOUND_ROWS * FROM course
                ${req.userInfoLaoGuo.type === '0' ? ' WHERE is_show=1' : ''}
                ORDER BY Id DESC
                LIMIT ${(pageIndex - 1) * pageSize},${pageSize}
                `;
                // 3 执行sql
                const data = await query(sql);
                data.forEach(d => d.img = parseFilePath(d.img));
                // 数据总量，用于分页
                const total = await query(`SELECT FOUND_ROWS() AS total;`)
                query.reCon();
                res.send({
                    code: 1,
                    msg: '获取成功',
                    data,
                    total: total[0].total,
                    index: Number(pageIndex),
                    size: Number(pageSize)
                });
            } catch (error) {
                console.log(error);
                res.send({
                    code: 0,
                    msg: '查询失败'
                })
            }
        }
    )
    .put(   // 修改课程
        upload.single('img'),   // 存储文件
        check(['id'], []),      // 校验必须在路径上跟随要修改数据的id
        async (req, res) => {
            try {
                // 1 根据id查询现有数据
                let data = await query(`SELECT * FROM course WHERE Id=?`, [req.query.id]);
                if (data.length === 0) return res.send({
                    code: 0,
                    msg: '没有这个数据'
                });
                data = data[0]; // 查询结果为数组,需要取到第一个
                // 2 根据现有数据设置默认值
                const name = req.body.name || data.name;
                const img = req.file?.path || data.img;
                // 3 执行修改操作
                await query(
                    "UPDATE course SET name=?,img=? WHERE Id=?",
                    [name, img, req.query.id]
                );

                res.send({
                    code: 1,
                    msg: "修改成功"
                });
            } catch (error) {
                console.log(error);
                res.send({
                    code: 0,
                    msg: '修改失败'
                })
            }
        }
    )
    .delete(    // 删除课程
        check(['id'], []),    // 验证必须同url传递id
        async (req, res) => {
            try {
                // 1、查询课程中所有的视频
                const videos = await query(`SELECT id,url FROM video WHERE course_id=?`, [req.query.id]);
                // 2、根据视频的url删除视频
                const ids = videos.map(video => {
                    fs.unlink(video.url).catch(() => { });   // 删除文件
                    return video.id;    // 返回id，组成新数组
                });
                if (ids.length) {
                    // 3、根据id删除视频数据
                    const delVideoSql = `DELETE FROM video WHERE id in (${ids.join(',')})`;
                    await query(delVideoSql);
                }

                // 4、删除封面图片
                const deleteCourseImg = `SELECT img FROM course WHERE Id=?`;
                const imgData = await query(deleteCourseImg, [req.query.id]);
                fs.unlink(imgData[0].img).catch(() => { });

                // 拼接删除课程sql, 根据id进行删除
                const deleteCourseSql = `DELETE FROM course WHERE Id=?`;
                // 执行sql
                await query(deleteCourseSql, [req.query.id]);
                res.send({
                    code: 1,
                    msg: '删除成功'
                });
            } catch (error) {
                console.log(error);
                res.send({
                    code: 0,
                    msg: '删除失败'
                });
            }
        }
    );

// 上下架操作
router.put(
    '/change',
    check(['id'], []),   // 校验id
    async (req, res) => {
        try {
            // 先查询当前的上架信息
            const sql = `SELECT is_show FROM course WHERE Id=?`;
            let show = await query(sql, [req.query.id]);
            if (show.length === 0) return res.send({
                code: 0,
                msg: "不存在该课程"
            });
            // 读取状态
            show = show[0].is_show;
            // 修改上架状态
            show = show === 0 ? 1 : 0;
            // 执行修改操作
            const sql1 = `UPDATE course SET is_show=${show} WHERE Id=?`;
            await query(sql1, [req.query.id]);
            res.send({
                code: 1,
                msg: show === 1 ? "上架成功" : '下架成功'
            });
        } catch (error) {
            console.log(error);
            res.send({
                code: 0,
                msg: '操作失败'
            });
        }
    }
)


module.exports = router;
